package lee.study.innodb;

import org.springframework.beans.factory.annotation.Value;

/**
 * @author licc
 * @create 2017-11-28 19:03
 * @desc Innodb主线程
 **/
@SuppressWarnings("all")
public class MasterThread {
    /**
     * 默认缓冲池脏页比例
     */
    @Value("innobd.max.dirty.pages.pct")
    private Integer default_innobd_max_dirty_pages_pct;
    /**
     * 前一秒发生IO的次数
     */
    private int lastOneSecondIOs;
    /**
     * 前十秒发生IO的次数
     */
    private int lastTenSecondIOs;

    /**
     * 1.0.x版本之前的master thread
     */
    public void master_thread_before_1_0_x() throws InterruptedException {
        long countor = 1;

        // 主loop
        while (countor<2) {
            for (int i = 0; i < 10; i++) {
                once_per_one_second_operate();
                Thread.sleep(1000);
            }
            once_per_ten_second_operate();
        }

       master_thread_before_1_0_x();
    }

    /**
     * 一秒执行一次的操作
     */
    public void once_per_one_second_operate() throws InterruptedException {
        // 当前缓冲池中脏页的比例
        int buf_get_modified_ratio_pct = (int) Math.random()*100;

        // 当前用户活动
        Boolean haveUserActivite = Math.random()>0.5?true:false;

        //日志缓冲刷新到磁盘,即使这个事务还没有提交
        System.out.println("do log buffer flush to disk");
        if (lastOneSecondIOs < 5) {
            // 合并插入到缓冲
            System.out.println("do merge insert buffer");
        }

        // 当前缓冲池中的脏页比例大于配置的脏页比例
        if (buf_get_modified_ratio_pct > default_innobd_max_dirty_pages_pct) {
            // 刷新100个InnoDB的缓冲池中的脏页到磁盘
            System.out.println("");
        }

        // 当前没有用户活动 跳到background loop
        if (!haveUserActivite){
            background_loop_operate();
        }
    }

    /**
     * 十秒执行一次的操作
     */
    public void once_per_ten_second_operate() {
        // 当前缓冲池中脏页的比例
        int buf_get_modified_ratio_pct = (int) Math.random()*100;

        // 当前用户活动
        Boolean haveUserActivite = Math.random()>0.5?true:false;

        if (lastTenSecondIOs < 200) {
            System.out.println("刷新100个InnoDB的缓冲池中的脏页到磁盘");
        }

        System.out.println("合并至多5个插入到缓冲)");

        System.out.println("将日志缓冲刷新到磁盘");

        //即full purge操作 最多删除20个undo页
        System.out.println("删除无用的Undo页");

        // 当前缓冲池中的脏页比例大于配置的脏页比例
        if (buf_get_modified_ratio_pct > 70) {
            System.out.println("刷新100个InnoDB的缓冲池中的脏页到磁盘");
        }else {
            System.out.println("刷新10个InnoDB的缓冲池中的脏页到磁盘");
        }

    }

    public void background_loop_operate() throws InterruptedException {
        Boolean isIdle = Math.random()>0.5?true:false;
        // 删除无用的Undo页
        System.out.println("do full purge");
        //合并20个插入缓冲
        System.out.println("do merge 20 insert buffer");
        // 不空闲 跳回到主循环
        if (!isIdle) {
            master_thread_before_1_0_x();
        }else {
            flush_loop_operate();
        }
    }

    public void flush_loop_operate() throws InterruptedException {
        /**
         * 当前的脏页比例
         */
        int buf_get_modified_ratio_pct = (int) Math.random()*100;
        // 刷新100个脏页到磁盘
        System.out.println("do buffer pool flush 100 dirty pages");

        if (buf_get_modified_ratio_pct>default_innobd_max_dirty_pages_pct){
            flush_loop_operate();
        }

        suspend_loop_operate();

    }

    public void suspend_loop_operate() throws InterruptedException {
        System.out.println("suspend thread()");

        // 假设这个是等待的事件
        double waitingEvent = Math.random();
        while (waitingEvent>0.5){
            waitingEvent = Math.random();
            master_thread_before_1_0_x();
        }
    }
}
